package com.ds.common.org.expression.org;

import com.ds.common.expression.ParseException;
import com.ds.common.expression.function.AbstractFunction;
import com.ds.org.Org;
import com.ds.org.OrgManager;
import com.ds.org.OrgNotFoundException;
import com.ds.server.OrgManagerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 取得指定组织的下级组织（包括直接的和间接的）
 * <p>
 * Title: JDSORG组织机构中间件
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: jds Copyright (c) 2003-2008
 * </p>
 * <p>
 * Company: www.justdos.net
 * </p>
 * 
 * @author wenzhangli
 * @version 2.0
 */
public class GetAllChildrenOrg extends AbstractFunction {

    public Org[] perform(Object param1) throws ParseException {
	if (param1 == null) {
	    return new Org[0];
	}
	// 组织机构的标识
	if (param1 instanceof String) {
	    String orgId = (String) param1;
	    OrgManager accountManager = OrgManagerFactory.getOrgManager();
	    try {
		Org org = accountManager.getOrgByID(orgId);
		if (org != null) {
			List<Org> orgs=org.getChildrenRecursivelyList();
			return (Org[]) orgs.toArray(new Org[orgs.size()]);
		}
		return new Org[0];
	    } catch (OrgNotFoundException e) {
		return new Org[0];
	    }
	}
	// 组织机构对象
	if (param1 instanceof Org) {
	    List<Org> orgs=((Org) param1).getChildrenRecursivelyList();
	    return (Org[]) orgs.toArray(new Org[orgs.size()]);
	}
		if (param1 instanceof Org[]) {
			Org[] parentOrgs=(Org[])param1;

			List<Org> childOrgs=new ArrayList<Org>();

			for(Org org:parentOrgs ){
				List<Org> orgs=((Org) param1).getChildrenRecursivelyList();
				childOrgs.addAll(orgs);
			}


			return (Org[]) childOrgs.toArray(new Org[childOrgs.size()]);
		}

	throw new ParseException("Invalid parameter type in:" + this.getClass().getName() + ", param1 is " + param1.getClass().getName());
    }
}